home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 140
/
Gekkan Dennou Club - 2000.1 Vol. 140 (Japan).7z
/
Gekkan Dennou Club - 2000.1 Vol. 140 (Japan) (Track 1).bin
/
tools
/
dshell
/
dsh333bs.lzh
/
menusub.s
< prev
next >
Wrap
Text File
|
1999-07-11
|
4KB
|
262 lines
*
* dshell v3
*
* menu.c etc. の補助関数(達)
*
* int opmcall_d1(int d1_param);
* int on_zmusic(void);
* int on_pcm8(void);
* int killed_trap12(void);
* 970205更新・相原哲哉
*
_OPMDRV equ $f0
_B_WPEEK equ $83
_B_LPEEK equ $84
_B_MEMSTR equ $85
_INTVCG equ $ff35
* int opmcall_d1(int d1_param);
*
* OPMDRV/ZMUSICのシステムコールを行なう(事前にドライバ常駐チェック)
* サポートするのはm_play, m_stop, m_contのみ(引き数チェックなし)
*
.globl _opmcall_d1
_opmcall_d1:
bsr _on_zmusic
tst.l d0
beq od1_not_zms
lsr.w #8,d0
cmpi.b #3,d0 *v3か
beq od_zmsc3 *ならばしね。
* zmsc zmusic1,2 の時 ... trap #3 を使用
movem.l d3-d4,-(sp)
moveq #0,d2
moveq #0,d3
moveq #0,d4
move.l 12(sp),d1
trap #3
movem.l (sp)+,d3-d4
rts
od_zmsc3: *v3対処(対応と言わないところが謙虚)
move.l #0,a1
movem.l d3-d4,-(sp)
moveq #0,d2
moveq #0,d3
moveq #0,d4
move.l 12(sp),d0 *ファンクション番号入れるレジスタ変更されてる
cmpi.l #$08,d0
beq 2f
cmpi.l #$0a,d0
bne 1f
move.l #$0c,d0 *m_stopの移動
bra 2f
1:
move.l #$0d,d0 *m_contの移動
2:
trap #3
movem.l (sp)+,d3-d4
rts
od1_not_zms:
bsr on_opmdrv
tst.l d0
beq od1_error
* opmdrv(たぶん)の場合 ... IOCS _OPMDRV を使用
moveq #0,d2
move.l 4(sp),d1
moveq #_OPMDRV,d0
trap #15
rts
od1_error:
moveq #-1,d0
rts
* int on_zmusic(void);
*
* zmusic v2 が常駐してないかチェックする
*
* 戻り値:常駐してる ... バージョン(例えば v1.52なら0x152 などを返す)
* 常駐してない ... 0
*
*trap #3のベクタのアドレス-8 から文字列 "ZmuSiC" $20 があれば zmusic v2常駐と判断
*するように変更:相原
*
*
.globl _on_zmusic
_on_zmusic:
move.w #$23,-(sp)
dc.w _INTVCG
addq.l #2,sp
.if 0
move.l #$ffc00000,d1
and.l d0,d1
bne onz_nozms
.else
swap.w d0
cmpi.b #$f0,d0
bcc onz_nozms
swap.w d0
.endif
movea.l d0,a1
subq.l #8,a1
lea onz_bf(pc),a2
move.l a2,a0
moveq #7,d1 * 転送バイト数( 'ZmuSiC'+version(2bytes) の長さ-1 )
moveq #_B_MEMSTR,d0
trap #15
lea zmark(pc),a1
moveq #5,d0 * loop回数( 'ZmuSiC' の長さ-1 )
onz_l1:
cmpm.b (a0)+,(a1)+
bne onz_nozms
dbra d0,onz_l1
moveq #0,d0
move.b (a0)+,d0
lsl.w #8,d0
move.b (a0),d0
lsl.b #4,d0
lsr.w #4,d0
rts
onz_nozms:
moveq #0,d0
rts
zmark: .dc.b 'ZmuSiC'
.even
onz_bf: ds.b 8
*
* int on_opmdrv(void);
*
* opmdrv があるかチェック
*
* 戻り値:ある ... 0以外
* ない ... 0
*
*(0 =< (_OPMDRV のベクタ) < c00000 なら OPMDRV有りと判断(手抜きチェックだ…))
on_opmdrv:
move.w #$100+_OPMDRV,-(sp)
dc.w _INTVCG
addq.l #2,sp
.if 0
and.l #$ffc00000,d0
bne ono_error
.else
swap.w d0
cmpi.b #$f0,d0
bcc ono_error
.endif
moveq #1,d0
rts
ono_error:
moveq #0,d0
rts
*
* int on_pcm8(void);
*
* pcm8 の常駐チェック トラップベクタ取得方式(PCM8TECH.DOC)使用
*
* 戻り値:常駐している ... バージョン (例えば v0.48なら0x48 等を返す)
* 常駐してない ... 0
.globl _on_pcm8
_on_pcm8:
move.w #$22,-(sp)
dc.w _INTVCG
addq.l #2,sp
.if 0
subq.l #8,d0
move.l #$ffc00000,d1
and.l d0,d1
bne onp8_nopcm8
.else
swap.w d0
cmpi.b #$f0,d0
bcc onp8_nopcm8
swap.w d0
subq.l #8,d0
.endif
movea.l d0,a1
lea onp8_bf(pc),a2
move.l a2,a0
moveq #7,d1 * 転送バイト数( 'PCM8/'+version(3bytes) の長さ-1 )
moveq #_B_MEMSTR,d0
trap #15
lea onp8_mark(pc),a1
moveq #4,d0 * 'PCM8/'の長さ-1
onp8_1:
cmp.b (a1)+,(a0)+
bne onp8_nopcm8
dbra d0,onp8_1
moveq #0,d0
move.l d0,d2
moveq #2,d1 * loop counter
onp8_2:
lsl.l #4,d0
move.b (a0)+,d2
sub.b #'0',d2
add.l d2,d0
dbra d1,onp8_2
rts
onp8_nopcm8:
moveq #0,d0
rts
onp8_mark:
dc.b 'PCM8/',0
onp8_bf:
ds.b 8
even
* int killed_trap12(void);
*
* TRAP 12(ハードコピー割込み処理)の飛先がいきなり
* rte になっていないか(殺されていないか)チェック
* 殺されていた場合 0 以外を返す
*
.globl _killed_trap12
_killed_trap12:
lea $b0,a1
moveq #_B_LPEEK,d0
trap #15
move.l d0,a1
moveq #_B_WPEEK,d0
trap #15
cmp.w #$4e73,d0 * $4e73 = rte
beq killed12
moveq #0,d0
rts
killed12:
moveq #1,d0
rts
.end